// 集合(无序且唯一)
function Set() {
    let items = {}
    // 如果值在集合中，返回true,否则返回false
    this.has = function (value) {
        return items.hasOwnProperty(value)
    }
    
    // 向集合添加一个新项
    this.add = function (value) {
        if(!this.has(value)){
            items[value] = value;
            return true
        }
        return false;
    }
    
    // 从集合移除一个值
    this.delete = function (value) {
        if(this.has(value)){
            delete items[value];
            return true
        }
        return false
    }
    
    // 移除集合中的所有项
    this.clear = function () {
        items = {}
    }
    
    // 返回集合所包含元素的数量，与数组的length属性类似
    this.size = function () {
        return Object.keys(items).length;
    }
    
    // 返回一个包含集合中所有值的数组
    this.values = function () {
        let values = [];
        for(let i=0,keys=Object.keys(items);i<keys.length;i++){
            values.push(items[keys[i]])
        }
        return values
    }

    // 并集
    this.union = function (otherSet) {
        let unionSet = new Set();
        let values = this.values();
        for(let i=0;i<values.length;i++){
            unionSet.add(values[i])
        }
        values = otherSet.values();
        for(let i=0;i<values.length;i++){
            unionSet.add(values[i])
        }
        return unionSet;
    }

    // 交集
    this.intersection = function (otherSet) {
        let intersectionSet = new Set();
        let values = this.values();
        for(let i=0;i<values.length;i++){
            if(otherSet.has(values[i])){
                intersectionSet.add(values[i])
            }
        }
        return intersectionSet
    }

    // 差集
    this.difference = function (otherSet) {
        let differenceSet = new Set();
        let values = this.values();
        for(let i=0;i<values.length;i++){
            if(!otherSet.has(values[i])){
                differenceSet.add(values[i])
            }
        }
        return differenceSet;
    }

    // 子集
    this.subset = function (otherSet) {
        if (this.size() > otherSet.size()){
            return false;
        }else{
            let values = this.values();
            for(let i=0;i<values.length;i++){
                if(!otherSet.has(values[i])){
                    return false;
                }
            }
            return true
        }
    }
}

let setA = new Set();
setA.add(1);
setA.add(2);
setA.add(3);
setA.add(4);
setA.add(5);
let setB = new Set();
setB.add(1);
setB.add(2);

console.log(setB.subset(setA))  // 判断setB是setA的子集

